package com.it.myd.module.game.saolei.service;

import com.it.myd.bean.main.User;
import com.it.myd.module.game.saolei.bean.SLLei;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

@Service
public class SaoLeiServiceImpl implements SaoLeiService {

    private SLLei[][] list;
    private User user;

    private int x;
    private int y;
    private int l;
    @Override
    public Map<String,String> getSaoLeiTable(){
        Map<String,String> map = new HashMap<>();
        map.put("x",String.valueOf(x));
        map.put("y",String.valueOf(y));
        map.put("l",String.valueOf(l));
        return map;
    }
    @Override
    public void setSaoLeiTable(int x,int y,int l){
        this.x = x;
        this.y = y;
        this.l = l;
    }


    public void setUser(User user){
        this.user = user;
    }
    @Override
    public SLLei[][] creatSaoleiTable() {
        list = new SLLei[y][x];
        initSaoleiTable();
        insertLei(l);
        insertNum();
        return list;
    }

    public void initSaoleiTable(){
        for(int i=0;i<list.length;i++) {
            for(int j=0;j<list[i].length;j++) {
                list[i][j]=new SLLei();
            }
        }
    }

    public void insertLei(int l){
        Random rd = new Random();
        for(int i = 1 ; i <= l ;) {

            int y = rd.nextInt(list.length);
            int x= rd.nextInt(list[y].length);

            if(list[y][x].getValue() == -1) {

            }else {
                list[y][x].setValue(-1);
                i++;
            }
        }
    }

    public void insertNum(){
        for(int i=0;i<list.length;i++) {
            for(int j=0;j<list[i].length;j++) {
                if(list[i][j].getValue()==-1) {
                    for(int x=-1;x<2;x++) {
                        for(int y=-1;y<2;y++) {
                            if(i+x!=-1 && i+x!=list.length) {
                                if(j+y!=-1 && j+y!=list[i].length) {
                                    if(x==0&&y==0){

                                    }else if(list[i+x][j+y].getValue()==-1){

                                    }else {
                                        list[i+x][j+y].setValue(list[i+x][j+y].getValue()+1);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    public String clickSaoleiTable(int x,int y){
        openSaoleiTable(x,y);
        if(list[y][x].getValue()==-1) {
            return "-1";
        }else if(list[y][x].getValue()==0){
            first(x, y);
            while(second());
            third();
            return "0";
        }else{
            return "1";
        }
    }

    public void openSaoleiTable(int x ,int y){
        list[y][x].setType("0");
        list[y][x].setImg(user.getUser_img().getFile_path()+user.getUser_img().getFile_name());
    }

    protected void first(int x,int y) {
        for(int i=-1;i<2;i++) {
            for(int j=-1;j<2;j++) {
                if((i+j==1||i+j==-1)&&(y+i>-1 && y+i<list.length) && (x+j>-1 && x+j<list[y+i].length)) {
                    if(list[y+i][x+j].getValue()==0 && list[y+i][x+j].getType().equals("1")) {
                        openSaoleiTable(x+j,y+i);
                    }
                }
            }
        }
    }

    protected boolean second() {
        boolean flag = false;
        for(int x=0;x<list.length;x++) {
            for(int y=0;y<list[x].length;y++) {
                if(list[x][y].getValue()==0 && list[x][y].getType().equals("0")) {
                    for(int i=-1;i<2;i++) {
                        for(int j=-1;j<2;j++) {
                            if((i+j==1||i+j==-1)&&(x+i>-1 && x+i<list.length) && (y+j>-1 && y+j<list[x+i].length)) {
                                if(list[x+i][y+j].getValue()==0 && list[x+i][y+j].getType().equals("1")) {
                                    openSaoleiTable(y+j,x+i);
                                    flag = true;
                                }
                            }
                        }
                    }
                }
            }
        }
        return flag;
    }

    protected void third() {
        for(int x=0;x<list.length;x++) {
            for(int y=0;y<list[x].length;y++) {
                if(list[x][y].getValue()==0 && list[x][y].getType().equals("0")) {
                    for(int i=-1;i<2;i++) {
                        for(int j=-1;j<2;j++) {
                            if((x+i>-1 && x+i<list.length) && (y+j>-1 && y+j<list[x+i].length)) {
                                if(list[x+i][y+j].getValue()!=0 && list[x+i][y+j].getType().equals("1")) {
                                    openSaoleiTable(y+j,x+i);
                                }
                            }
                        }
                    }
                }
            }
        }
    }

}
